home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / WINER.ZIP / INTRO.TXT < prev    next >
Text File  |  1994-09-04  |  20KB  |  356 lines

  1.  
  2.               PC Magazine's BASIC Techniques and Utilities
  3.  
  4.                              by Ethan Winer
  5.  
  6.  
  7.                  In memory of my father, Dr. Frank Winer
  8.  
  9.  
  10.                             TABLE OF CONTENTS
  11.  
  12.    INTRODUCTION
  13.  
  14. Part I: UNDER THE HOOD
  15.  
  16.    Chapter 1. An Introduction to Compiled BASIC
  17.    Chapter 2. Variables and Constant Data
  18.    Chapter 3. Programming Methods
  19.  
  20. Part II: HANDS-ON PROGRAMMING
  21.  
  22.    Chapter 4. Debugging Strategies
  23.    Chapter 5. Compiling and Linking
  24.    Chapter 6. File and Device Handling
  25.    Chapter 7. Database and Network Programming
  26.    Chapter 8. Sorting and Searching
  27.  
  28. Part II: BEYOND BASIC
  29.  
  30.    Chapter 9. Program Optimization
  31.    Chapter 10. Key Memory Areas in the PC
  32.    Chapter 11. Accessing DOS and BIOS Services
  33.    Chapter 12. Assembly Language Programming
  34.  
  35.  
  36.                             ACKNOWLEDGEMENTS
  37.  
  38. Many people helped me during the preparation of this book.  First and
  39. foremost I want to thank my publisher, Cindy Hudson, for her outstanding
  40. support and encouragement, and for making it all happen.  I also want to
  41. thank "black belt" editor Deborah Craig for a truly outstanding job.  Never
  42. had I seen someone reduce a sentence from 24 words to less than half that,
  43. and improve the meaning in the process. [Unfortunately, readers of this
  44. disk version are unable to benefit from Deborah's excellent work.]
  45.  
  46.    Several other people deserve praise as well:
  47.  
  48.    Don Malin for his programming advice, and for eliminating 
  49. all my GOTO statements.
  50.  
  51.    Jonathan Zuck for his contribution on database and network 
  52. programming, including all of the dBASE file access routines.
  53.  
  54.    Paul Passarelli for unraveling the mysteries of floating 
  55. point emulation, and for sharing that expertise with me.
  56.  
  57.    Philip Martin Valley for his research and examples showing 
  58. how to read Lotus 1-2-3 binary files.
  59.  
  60.    Jim Mack for his skillful proof-reading of my manuscript, 
  61. and countless good ideas.
  62.  
  63.    My wife Elli for her support and encouragement during the
  64. eight long months it took to write this book.
  65.  
  66.  
  67. ABOUT THE AUTHOR
  68.  
  69. Ethan Winer is the founder of Crescent Software, Inc. located Ridgefield
  70. Connecticut.  He has programmed in BASIC and assembly language since 1980,
  71. and is the author of Crescent's QuickPak Professional and P.D.Q. products. 
  72.    Ethan has also served as a contributing editor for both PC Magazine and
  73. BASICPro (now Visual Basic Programmer's Journal), and has written numerous
  74. feature articles for other popular computer publications.  In 1992 Ethan
  75. retired from writing software professionally, and now spends his free time
  76. writing and performing music.
  77.  
  78.  
  79.                                  PREFACE
  80.  
  81.  
  82. INTRODUCTION
  83. ============
  84.  
  85. BASIC has always been the most popular language for personal computers. 
  86. It is easy to learn and use, extremely powerful, and some form of BASIC is
  87. included for free with nearly every PC.  Although BASIC is often associated
  88. with beginners and students, it is in fact ideally suited for a wide range
  89. of programming projects.  Because it offers the best features of a high-
  90. level language coupled with direct access to DOS and BIOS system services,
  91. BASIC is fast becoming the language of choice for beginners and
  92. professional developers alike.
  93.    This book is about power programming using Microsoft compiled BASIC. 
  94. It is intended for people who already possess a fundamental understanding
  95. of BASIC programming concepts, but want to achieve the best performance
  96. possible from their BASIC compiler.
  97.    Power programming is knowing when and how to use BASIC commands such as
  98. CALL INTERRUPT, VARSEG and VARPTR, and even PEEK and POKE effectively.  It
  99. involves understanding the PC's memory organization sufficiently to
  100. determine how much stack space is needed for a recursive subprogram or
  101. function.  A power programmer knows how to translate a time-critical
  102. portion of a BASIC program into assembly language when needed.  Finally,
  103. and perhaps most importantly, power programming means knowing enough about
  104. BASIC's internal operation to determine which sequence of instructions is
  105. smaller or faster than another.
  106.    This book will show you how to go beyond creating programs that merely
  107. work.  Because it explains how the compiler operates and how it interacts
  108. with the BASIC runtime language library, this book will teach you how to
  109. write programs that are as small and fast as possible.  Although the
  110. emphasis here is on Microsoft QuickBASIC and the BASIC Professional
  111. Development System (PDS), much of the information will apply to other BASIC
  112. compilers such as Power Basic from Spectra Publishing.
  113.    Despite what you may have read, BASIC is the most capable and easy to
  114. learn of the high-level languages.  Modern BASIC compilers are highly
  115. optimizing, and can thus create extremely efficient executable programs. 
  116. In addition, you can often achieve with just a few BASIC statements what
  117. would take many pages of code in another high-level language.  Moreover,
  118. beginners can be immediately productive in BASIC, while serious programmers
  119. have a wealth of powerful capabilities at their disposal.
  120.    Microsoft BASIC has many capabilities that are not available in any
  121. other high-level language.  Among these are dynamic (variable-length)
  122. strings, automatic memory allocation and heap management, built-in support
  123. for sophisticated graphics, and interrupt-driven communications.  Add to
  124. that huge arrays, network file handling, music and sound, and protection
  125. against inadvertently overwriting memory, and you can see why BASIC is so
  126. popular.  
  127.    This book aims to provide intermediate to advanced programmers with
  128. information that is not available elsewhere.  It does not, however, cover
  129. elementary topics such as navigating the QuickBASIC editor, loading and
  130. saving files, or using the Search and Replace feature.  That information
  131. is readily available elsewhere.  Rather, it delves into previously
  132. uncharted territory, and examines compiled BASIC at its innermost layer.
  133.    Besides the discussions and programs in the text, this book includes a
  134. companion disk [separate ZIP file] that contains all of the subroutines and
  135. other code listed in this book, including several useful utilities. 
  136. Installing these programs is described in the Appendix.
  137.  
  138.  
  139. CONVENTIONS USED IN THIS BOOK
  140. =============================
  141.  
  142. This book uses the terms QuickBASIC and QB to mean the Microsoft QuickBASIC
  143. 4.x and 7.x editing environments.  BC and Compiler indicate the BC.EXE
  144. command-line compiler that comes with QuickBASIC, Microsoft BASIC PDS, and
  145. the now-discontinued BASIC 6.0.  When a distinction is necessary, QBX will
  146. refer to the QuickBASIC Extended editor that comes with the BASIC
  147. Professional Development System (PDS).  In most cases, the discussions will
  148. be the same for all of these versions of BASIC.  When a difference does
  149. occur, the PDS and QBX exceptions will be indicated.
  150.    [Because there is no way to indicate italics in a disk file, where they
  151. would have been used for emphasis or clarity the words are instead
  152. surrounded by asterisks (*).]
  153.  
  154.  
  155. HOW THIS BOOK IS ORGANIZED
  156. ==========================
  157.  
  158. This book is divided into parts, and each part contains several chapters
  159. that discuss a specific aspect of BASIC programming.  You needn't fully
  160. understand an entire chapter before moving on to the next one.  Each topic
  161. will be covered in great depth, and in many cases you will want to return
  162. to a given chapter as your knowledge and understanding of the subject
  163. matter increases.
  164.    Part 1 is "Under the Hood," and its three chapters describe in detail
  165. how your BASIC source code is manipulated throughout the compiling and
  166. linking process.
  167.    Chapter 1 presents an overview of compilers in general, and BASIC
  168. compilers in particular,  It discusses what BASIC compilers are all about
  169. and how they work, and how the compiled code that is generated interacts
  170. with routines in the runtime libraries.
  171.    Chapter 2 discusses variables, constants, and other program data, and
  172. how they fit within the context of the PC's memory organization.  This
  173. chapter also covers bit manipulation using AND, OR, and XOR.
  174.    Chapter 3 examines the various control flow methods available in BASIC,
  175. showing which statements and procedure constructs are appropriate in
  176. different situations.  In particular, you will learn the relative
  177. advantages and disadvantages of each method, based on their capabilities,
  178. code size, and speed.
  179.    Part 2, "Programming Hands On," examines programming techniques, and
  180. shows specific examples of writing effective code and also making it work.
  181.    Chapter 4 explores program debugging using the facilities built into the
  182. QuickBASIC editing environment, as well as the CodeView utility that comes
  183. with Microsoft BASIC PDS.  This chapter also discusses common programming
  184. problems, along with the appropriate solutions.
  185.    Chapter 5 explains compiling and linking, both from within the QB
  186. environment, and directly from DOS.  A number of compiler options are
  187. inadequately documented by Microsoft, and each is discussed here in great
  188. detail.  A thorough discussion of the LIB.EXE utility program included with
  189. BASIC explains how libraries are manipulated and organized.
  190.    Chapter 6 covers all aspects of file and device handling, and discusses
  191. the many different ways in which data may be read and written.  The
  192. emphasis here is on speeding file handling as much as possible, and storing
  193. data on disk efficiently.  Because input/output (I/O) devices are accessed
  194. similarly, they too are described here in detail.
  195.    Chapter 7 explains the basics of writing database and network
  196. applications, and discusses file locking strategies using practical
  197. programming examples.  A series of subroutines show how to read and write
  198. files using the popular dBASE format, and these may be incorporated into
  199. program that you write.
  200.    Chapter 9 shows how to sort and search array data as quickly as
  201. possible.  Several methods are examined including conventional and indexed
  202. sorting, and many useful subroutines are presented.
  203.    The final part, "Beyond BASIC," includes information that is rarely
  204. covered in books about BASIC.  Its three chapters go far beyond the
  205. information provided in any of the Microsoft manuals.
  206.    Chapter 10 identifies many of the key memory areas in the PC, and shows
  207. when and how they can be manipulated in a BASIC program.
  208.    Chapter 11 presents an in-depth discussion of accessing DOS and BIOS
  209. services using CALL INTERRUPT.  These services offer a wealth of
  210. functionality that BASIC cannot otherwise provide directly.
  211.    Chapter 12 is an introduction to assembly language, from a BASIC
  212. programmer's perspective.  This chapter presents many useful subroutines,
  213. and includes a thorough discussion of how they work.
  214.    Finally, the Appendix describes the additional source files that
  215. accompany this book.
  216.  
  217.  
  218. A BRIEF HISTORY OF MICROSOFT COMPILED BASIC
  219. ===========================================
  220.  
  221. In March of 1982, IBM released the first BASIC compiler for the IBM PC. 
  222. This compiler, BASCOM 1.0, was written by Microsoft for IBM using code and
  223. methods developed by Bill Gates, Greg Whitten, and others.  Although
  224. Microsoft had already written BASIC compilers for the Apple II and CP/M
  225. computers, BASCOM 1.0 was the most powerful they had produced so far.  
  226.    Compared to the Microsoft BASIC interpreters available at that time,
  227. BASCOM 1.0 offered many additional capabilities, and also an enormous
  228. increase in program execution speed.  Line numbers were no longer
  229. mandatory, program statements could exceed 255 characters, and a single
  230. string could be as long as 32,767 characters.  Further, assembly language
  231. subroutines could be linked directly to a compiled BASIC application.
  232.    Over the next few years, Microsoft continued to enhance the compiler,
  233. and in 1985 it was released by IBM as BASCOM 2.0.  This version offered
  234. many improvements over the older BASCOM 1.0.  Among the most important were
  235. multi-line DEF FN functions, dynamic arrays, descriptive line labels (as
  236. opposed to numbers), network record locking, and an ISAM file handler. 
  237. With named subroutines programmers were finally able to exceed the 64K code
  238. size limitation, by writing separate modules that could then be linked
  239. together.  The inclusion of subroutine parameters--long overdue for BASIC-
  240. -was an equally important step toward fostering structured programming
  241. techniques in the language.
  242.    At the same time that IBM released BASCOM 2.0, Microsoft offered
  243. essentially the same product as QuickBASIC 1.0, but without the ISAM file
  244. handler.  However, there was one other big difference between these
  245. compilers: QuickBASIC 1.0 carried a list price of only $99.  This low price
  246. was perhaps the most important feature of all, because high-performance
  247. BASIC was finally available to everyone, and not just professional
  248. developers.
  249.    Encouraged by the tremendous acceptance of QuickBASIC 1.0, Microsoft
  250. quickly followed that with QuickBASIC version 2.0 in early 1986.  This
  251. important new release added an integrated editing environment, as well as
  252. EGA graphics capabilities.  The editor was especially welcome, because it
  253. allowed programs to be developed and tested very rapidly.  The environment
  254. was further enhanced with the advent of Quick Libraries, which allowed
  255. assembly language subroutines to be easily added to a BASIC program.  Quick
  256. Libraries also helped launch the start of a new class of BASIC product:
  257. third-party add-on libraries.
  258.    In early 1987 Microsoft released the next major enhancement to
  259. QuickBASIC, version 3.0.  QuickBASIC 3.0 included a limited form of step
  260. and trace debugging, as well as the ability to monitor a variable's value
  261. continuously during program execution.  Also added was support for the
  262. EGA's 43-line text mode, and several new language features.  Perhaps most
  263. impressive of the new features was the control flow statements DO and LOOP,
  264. and SELECT CASE.  Beyond merely providing a useful alternative to the IF
  265. statement, these constructs also let the compiler generate more efficient
  266. code.  
  267.    Also added with version 3.0 was optional support for an 8087 numeric
  268. coprocessor.  In order to support a coprocessor, however, Microsoft had to
  269. abandon their own proprietary numeric format. 
  270. Both the Microsoft and IEEE methods for storing single- and double
  271. precision numbers use four bytes and eight bytes respectively, but the bits
  272. are organized differently.  Although the IEEE format which the 8087
  273. requires is substantially slower than Microsoft's own, it is the current
  274. standard.  Therefore, a second version of the compiler was included solely
  275. to support IEEE math.
  276.    By the time QuickBASIC 4.0 was announced in late 1987, hundreds of
  277. thousands of copies of QuickBASIC were already in use world-wide.  With
  278. QuickBASIC 4.0, Microsoft had created the most sophisticated programming
  279. environment ever seen in a main-stream language: the threaded p-code
  280. interpreter.  This remarkable technology allowed programmers to enjoy the
  281. best features of an interpreted language, but with the execution speed of
  282. a compiler.
  283.    In addition to an Immediate mode whereby program statements could be
  284. executed one by one, QuickBASIC 4.0 also supported program break-points,
  285. monitoring the value of multiple variables and expressions, and even
  286. stepping *backwards* through a program.  This greatly enhanced the
  287. debugging capabilities of the language, and increased programmer
  288. productivity enormously.  
  289.    Also new in QuickBASIC 4.0 was support for inter-language calling. 
  290. Although this meant that a program written in Microsoft BASIC could now
  291. call subroutines written in any of the other Microsoft languages, it also
  292. meant that IEEE math was no longer an option--it became mandatory.  When
  293. a QuickBASIC 4.0 program was run on a PC equipped with a coprocessor,
  294. floating point math was performed very quickly indeed.  However, it was
  295. very much slower on every other computer!  This remained a sore point for
  296. many BASIC programmers, until Microsoft introduced BASIC 6.0 later that
  297. year.  That version included an alternate math library that was similar to
  298. their original proprietary format.
  299.    Also added in QuickBASIC 4.0 were huge arrays, long (4-byte) integer
  300. variables, user-defined TYPE variables, fixed-length strings, true
  301. functions, and support for CodeView debugging.  With the introduction of
  302. huge arrays, BASIC programmers could create arrays that exceeded 64K in
  303. size, with only a few restrictions.  TYPE variables let the programmer
  304. define a composite data type comprised of any mix of BASIC's intrinsic
  305. data forms, thus adding structure to a program's data as well as to its
  306. code.  The newly added FUNCTION procedures greatly improved on BASIC's
  307. earlier DEF FN-style functions by allowing recursion, the passing of TYPE
  308. variables and entire arrays as arguments, and the ability to modify an
  309. incoming parameter.
  310.    Although BASIC 6.0 provided essentially the same environment and
  311. compiler as QuickBASIC 4.0, it also included the ability to create programs
  312. that could be run under OS/2.  Other features of this release were a
  313. utility program to create custom run-time libraries, and a copy of the
  314. Microsoft Programmer's Editor.  The custom run-time utility was
  315. particularly valuable, since it allowed programmers to combine frequently-
  316. used subroutines with the BRUN.EXE language library, and then share those
  317. routines among any number of chained modules.
  318.    QuickBASIC 4.5 was introduced in 1988, although the only major
  319. enhancement over the earlier 4.0 version was a new help system and slightly
  320. improved pull-down menus.  Unfortunately, the new menus required much more
  321. memory than QuickBASIC 4.0, and the "improved" environment reduced the
  322. memory available for programs and data by approximately 40K.  To this day,
  323. many programmers continue to use QuickBASIC 4.0 precisely because of its
  324. increased program capacity.
  325.    In answer to programmer's demands for more string memory and  smaller,
  326. more efficient programs, Microsoft released the BASIC Professional
  327. Development System version 7.0 in late 1989.  This was an enormous project
  328. even for a company the size of Microsoft, and at one point more than fifty
  329. programmers were working on the new compiler and QBX environment.  PDS
  330. version 7.0 finally let BASIC programmers exceed the usual 64K string
  331. memory limit, albeit with some limitations.
  332.    Other features introduced with that version were an ISAM file handler,
  333. improved library granularity, example tool box packages for creating simple
  334. graphics and pull-down menus, local error handling, arrays within TYPE
  335. variables, and greatly improved documentation.  Because the QBX editor uses
  336. expanded memory to store subprograms and functions, much larger programs
  337. could be developed without resorting to editing and compiling outside of
  338. the environment.
  339.    Sixth months later PDS version 7.1 was released, with the long-overdue
  340. ability to redimension an array but without destroying its contents.  Also
  341. added in that version were support for passing fixed-length string arrays
  342. to subprograms and functions, and an option to pass parameters by value to
  343. BASIC procedures.  Although the BYVAL option had been available since
  344. QuickBASIC 4.0, it was useable only with subroutines written in non-BASIC
  345. languages.  With this mechanism, BASIC can now create more efficient object
  346. code than ever before.
  347.    [Just as this book was being completed, Microsoft released Visual Basic
  348. for DOS.  Although this book does not address VB/DOS specifically, most of
  349. the information about BASIC PDS applies to VB/DOS.  One notable exception
  350. is that VB/DOS supports far strings only, where BASIC PDS lets you specify
  351. either near strings or far.  Because far strings are stored in a separate
  352. "far" area of DOS memory, it takes slightly longer to access those strings. 
  353. Therefore, a VB/DOS program that is string-intensive will not be as fast
  354. as an equivalent compiled with QuickBASIC or with PDS near strings.  This
  355. book also does not cover the pseudo event-driven forms used by VB/DOS.]
  356.